﻿using System;
using System.Collections.Generic;
using System.Globalization;
using System.Web.UI.WebControls;
using Rendiciones.Logica.Enumeradores;
using Rendiciones.Logica.Modelos;
using Rendiciones.Web.infraestructura;
using System.Linq;

namespace Rendiciones.Web.Gerente
{
    public partial class BusquedaDeRendiciones : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                LimpiarErrores(pnlBusqueda);
                CargarCombos();
                Limpiar();
            }
        }

        private void Limpiar()
        {
            Desde = null;
            Hasta = null;
            IdProyecto = 0;
            IdEstado = 0;
            IdCustodio = 0;
            IdResponsable = 0;
            IdGerente = 0;
            IdBanco = 0;
            NumeroRendicion = 0;
            CentroDeCostos = "";
            NumeroCheque = "";
            NumeroTransferencia = "";
            NumeroDeposito = "";
            Resultados = new List<ResultadoBusqueda>();
        }
        private void CargarCombos()
        {
            try
            {
                CargarProyectos();
                CargarEstados();
                CargarCustodios(false);
                CargarResponsables(false);
                CargarGerentes(true);
                CargarBancos();
            }
            catch (Exception exception)
            {
                MuestraMensajeError(pnlBusqueda, "<strong>Error:</strong> " + exception.Message);
            }
        }
        private void CargarProyectos()
        {
            ddlProyectos.Items.Clear();
            var proyectos = Modulos.Rendiciones.Proyectos.Buscar("", true);
            ddlProyectos.Items.Add(new ListItem("[Seleccionar Proyecto...]", ""));
            foreach (var proyecto in proyectos)
                ddlProyectos.Items.Add(new ListItem(proyecto.Nombre, proyecto.IdProyecto.ToString(CultureInfo.InvariantCulture)));
        }
        private void CargarEstados()
        {
            ddlEstado.Items.Clear();
            var estados = Modulos.Rendiciones.Estados.ObtenerTodos();
            ddlEstado.Items.Add(new ListItem("[Seleccionar Estado...]", ""));
            foreach (var estado in estados)
                ddlEstado.Items.Add(new ListItem(estado.Descripcion, estado.IdEstado.ToString(CultureInfo.InvariantCulture)));
        }
        private void CargarCustodios(bool congelarCombo)
        {
            ddlCustodios.Items.Clear();
            var idUsuario = congelarCombo ? ObtenerIdUsuario(ERol.Custodio) : 0;
            var custodios = Modulos.Rendiciones.Usuarios.ActivosCuyoRolEs(ERol.Custodio);
            if (!idUsuario.Equals(0))
                custodios = custodios.Where(r => r.IdUsuario.Equals(idUsuario)).ToList();
            else
                ddlCustodios.Items.Add(new ListItem("[Seleccionar Custodio...]", ""));
            foreach (var custodio in custodios)
                ddlCustodios.Items.Add(new ListItem(custodio.NombreCompleto, custodio.IdUsuario.ToString(CultureInfo.InvariantCulture)));
        }
        private void CargarResponsables(bool congelarCombo)
        {
            ddlResponsables.Items.Clear();
            var idUsuario = congelarCombo ? ObtenerIdUsuario(ERol.Administrador) : 0;
            var responsables = Modulos.Rendiciones.Usuarios.ActivosCuyoRolEs(ERol.Administrador);
            if (!idUsuario.Equals(0))
                responsables = responsables.Where(r => r.IdUsuario.Equals(idUsuario)).ToList();
            else
                ddlResponsables.Items.Add(new ListItem("[Seleccionar Responsable...]", ""));
            foreach (var responsable in responsables)
                ddlResponsables.Items.Add(new ListItem(responsable.NombreCompleto, responsable.IdUsuario.ToString(CultureInfo.InvariantCulture)));
        }
        private void CargarGerentes(bool congelarCombo)
        {
            ddlGerentes.Items.Clear();
            var idUsuario = congelarCombo ? ObtenerIdUsuario(ERol.Gerente) : 0;
            var gerentes = Modulos.Rendiciones.Usuarios.ActivosCuyoRolEs(ERol.Gerente);
            if (!idUsuario.Equals(0))
                gerentes = gerentes.Where(r => r.IdUsuario.Equals(idUsuario)).ToList();
            else
                ddlGerentes.Items.Add(new ListItem("[Seleccionar Gerente...]", ""));
            foreach (var gerente in gerentes)
                ddlGerentes.Items.Add(new ListItem(gerente.NombreCompleto, gerente.IdUsuario.ToString(CultureInfo.InvariantCulture)));
        }
        private int ObtenerIdUsuario(ERol rol)
        {
            var usuario = UsuarioConectado;
            if (usuario == null)
                return 0;
            if (UsuarioConectado.Roles.Any(r => r.IdRol.Equals((int)rol)))
                return usuario.IdUsuario;
            return 0;
        }
        private void CargarBancos()
        {
            ddlBancos.Items.Clear();
            var bancos = Modulos.Rendiciones.Bancos.Buscar();
            ddlBancos.Items.Add(new ListItem("[Seleccionar Banco...]", ""));
            foreach (var banco in bancos)
                ddlBancos.Items.Add(new ListItem(banco.Descripcion, banco.IdBanco.ToString(CultureInfo.InvariantCulture)));
        }
        private DateTime? Desde { get { return StringToDatetime(txtDesde.Text.Trim(), '-'); } set { txtDesde.Text = value.HasValue ? value.Value.ToString("dd-MM-yyyy") : ""; } }
        private DateTime? Hasta { get { return StringToDatetime(txtHasta.Text.Trim(), '-'); } set { txtHasta.Text = value.HasValue ? value.Value.ToString("dd-MM-yyyy") : ""; } }
        private int IdProyecto
        {
            get
            {
                var selectedValue = ddlProyectos.SelectedItem == null ? "" : ddlProyectos.SelectedItem.Value;
                var value = 0;
                int.TryParse(selectedValue, out value);
                return value;
            }
            set
            {
                if (ddlProyectos.Items.Count.Equals(0)) return;
                var index = 0;
                for (var i = 0; i < ddlProyectos.Items.Count; i++)
                    if (ddlProyectos.Items[i].Value.Equals(value.ToString(CultureInfo.InvariantCulture)))
                        index = i;
                ddlProyectos.SelectedIndex = index;
            }
        }
        private int IdEstado
        {
            get
            {
                var selectedValue = ddlEstado.SelectedItem == null ? "" : ddlEstado.SelectedItem.Value;
                var value = 0;
                int.TryParse(selectedValue, out value);
                return value;
            }
            set
            {
                if (ddlEstado.Items.Count.Equals(0)) return;
                var index = 0;
                for (var i = 0; i < ddlEstado.Items.Count; i++)
                    if (ddlEstado.Items[i].Value.Equals(value.ToString(CultureInfo.InvariantCulture)))
                        index = i;
                ddlEstado.SelectedIndex = index;
            }
        }
        private int IdCustodio
        {
            get
            {
                var selectedValue = ddlCustodios.SelectedItem == null ? "" : ddlCustodios.SelectedItem.Value;
                var value = 0;
                int.TryParse(selectedValue, out value);
                return value;
            }
            set
            {
                if (ddlCustodios.Items.Count.Equals(0)) return;
                var index = 0;
                for (var i = 0; i < ddlCustodios.Items.Count; i++)
                    if (ddlCustodios.Items[i].Value.Equals(value.ToString(CultureInfo.InvariantCulture)))
                        index = i;
                ddlCustodios.SelectedIndex = index;
            }
        }
        private int IdResponsable
        {
            get
            {
                var selectedValue = ddlResponsables.SelectedItem == null ? "" : ddlResponsables.SelectedItem.Value;
                var value = 0;
                int.TryParse(selectedValue, out value);
                return value;
            }
            set
            {
                if (ddlResponsables.Items.Count.Equals(0)) return;
                var index = 0;
                for (var i = 0; i < ddlResponsables.Items.Count; i++)
                    if (ddlResponsables.Items[i].Value.Equals(value.ToString(CultureInfo.InvariantCulture)))
                        index = i;
                ddlResponsables.SelectedIndex = index;
            }
        }
        private int IdGerente
        {
            get
            {
                var selectedValue = ddlGerentes.SelectedItem == null ? "" : ddlGerentes.SelectedItem.Value;
                var value = 0;
                int.TryParse(selectedValue, out value);
                return value;
            }
            set
            {
                if (ddlGerentes.Items.Count.Equals(0)) return;
                var index = 0;
                for (var i = 0; i < ddlGerentes.Items.Count; i++)
                    if (ddlGerentes.Items[i].Value.Equals(value.ToString(CultureInfo.InvariantCulture)))
                        index = i;
                ddlGerentes.SelectedIndex = index;
            }
        }
        private int IdBanco
        {
            get
            {
                var selectedValue = ddlBancos.SelectedItem == null ? "" : ddlBancos.SelectedItem.Value;
                var value = 0;
                int.TryParse(selectedValue, out value);
                return value;
            }
            set
            {
                if (ddlBancos.Items.Count.Equals(0)) return;
                var index = 0;
                for (var i = 0; i < ddlBancos.Items.Count; i++)
                    if (ddlBancos.Items[i].Value.Equals(value.ToString(CultureInfo.InvariantCulture)))
                        index = i;
                ddlBancos.SelectedIndex = index;
            }
        }
        private int NumeroRendicion { get { var montoMateria = 0; int.TryParse(txtNroRendicion.Text.Trim(), out montoMateria); return montoMateria; } set { txtNroRendicion.Text = value.ToString(CultureInfo.InvariantCulture); } }
        private string CentroDeCostos { get { return txtCentroDeCostos.Text.Trim(); } set { txtCentroDeCostos.Text = value; } }
        private string NumeroCheque { get { return txtNroCheque.Text.Trim(); } set { txtNroCheque.Text = value; } }
        private string NumeroTransferencia { get { return txtNroTransferencia.Text.Trim(); } set { txtNroTransferencia.Text = value; } }
        private string NumeroDeposito { get { return txtNroDeposito.Text.Trim(); } set { txtNroDeposito.Text = value; } }
        private List<ResultadoBusqueda> Resultados { get { return new List<ResultadoBusqueda>(); } set { dgvResultados.DataSource = value; dgvResultados.DataBind(); lblTotal.Text = dgvResultados.Rows.Count.ToString(CultureInfo.InvariantCulture) + " Registros encontrados."; } }

        protected void GvResultadosRowCommand(object sender, System.Web.UI.WebControls.GridViewCommandEventArgs e)
        {
            try
            {
                var idRendicion = int.Parse(e.CommandArgument.ToString());
                switch (e.CommandName)
                {
                    case "Ver":
                        ctrlVistaPrevia.Mostrar(idRendicion);
                        break;
                    case "Workflow":
                        ctrlWorkFlow.Mostrar(idRendicion);
                        break;
                }
            }
            catch (Exception exception)
            {
                MuestraMensajeError(pnlBusqueda, "<strong>Error: </strong>" + exception.Message);
            }
        }

        protected void BtnBuscarClick(object sender, EventArgs e)
        {
            try
            {
                Resultados = Modulos.Rendiciones.Rendiciones.Buscar(
                    new ParametrosBusqueda
                    {
                        Desde = Desde,
                        Hasta = Hasta,
                        IdProyecto = IdProyecto,
                        IdEstado = IdEstado,
                        IdCustodio = IdCustodio,
                        IdResponsable = IdResponsable,
                        IdGerente = IdGerente,
                        IdBanco = IdBanco,
                        NumeroRendicion = NumeroRendicion,
                        CentroDeCostos = CentroDeCostos,
                        NumeroCheque = NumeroCheque,
                        NumeroTransferencia = NumeroTransferencia,
                        NumeroDeposito = NumeroDeposito
                    });
            }
            catch (Exception exception)
            {
                MuestraMensajeError(pnlBusqueda, "<strong>Error: </strong>" + exception.Message);
            }
        }

        protected void BtnLimpiarClick(object sender, EventArgs e)
        {
            Limpiar();
        }
    }
}